package undo_redo;

import java.util.Stack;

import commande.receiver.Editeur;

import undo_redo.MementoUR;

public class EnregistreurUR {

	private Editeur _editeur;
	private Stack<MementoUR> _pile_undo;
	private Stack<MementoUR> _pile_redo;
	private MementoUR _current;

	/**
	 * Constructeur avec initialition de l'editeur
	 * @param edit
	 */
	public EnregistreurUR(Editeur edit) {
		_pile_undo=new Stack<MementoUR>();
		_pile_redo=new Stack<MementoUR>();
		_editeur=edit;
	}
	
	/**
	 * Enregistrement d'une action dans la pile UNDO
	 * @param mem
	 */
	public void enregistrer(MementoUR mem) {
		_pile_undo.push(mem);
		_pile_redo.clear();
	}

	/**
	 * permet de depile la derniere action, le modifie en ajoutant la derniere chaine de caractere supprimer et le rempile 
	 * @param text
	 */
	public void ajoutEleSup(String text){
		_current = _pile_undo.pop();
		if(_current instanceof ConcreteMementoColler){
			((ConcreteMementoColler) _current).set_eleSup(text);
		}else if(_current instanceof ConcreteMementoSaisirTexte){
			((ConcreteMementoSaisirTexte) _current).set_eleSup(text);
		}else if(_current instanceof ConcreteMementoSupprimer){
			((ConcreteMementoSupprimer) _current).set_eleSup(text);
		}else{
			System.out.println("Erreur: EnregistreurUR -> ajoutEleSup");
		}
		_pile_undo.push(_current);
	}
	
	/**
	 * rejoue la derniere action defaite
	 */
	public void refaire() {
		if(!_pile_redo.empty()){
			_current = _pile_redo.pop();
			_pile_undo.push(_current);
			_editeur.setMementoR(_current);
		}
	}

	/**
	 * defait la derniere action
	 */
	public void defaire() {
		if(!_pile_undo.empty()){		
			_current = _pile_undo.pop();
			_pile_redo.push(_current);
			_editeur.setMementoU(_current);			
		}
	}
}
